EF entiteiten
Een entiteit is een klasse die toegewezen is aan een Entity Framework context met een eigen identiteit, of een eigenschap die op een unieke wijze instanties ervan identificeert. In DDD (domain driven design) jargon, spreekt men van een aggregate root als het de bedoeling is om de entiteit direct te bevragen, denk aan een Order of een Curstomer. Een entiteit kan ook samen met een aggregate root worden geladen en niet op zichzelf bestaan zoals bijvoorbeeld OrderItem. Een entiteit wordt opgeslagen in zijn eigen tabel en kan één of meerdere validatie-methoden hebben.
Een domein model waarin de entiteiten alleen eigenschappen (gegevens) en geen methoden (gedrag) bevatten, wordt ook wel een anemisch domein model genoemd. Je kunt een goede beschrijving voor deze anti-patroon op Martin Fowler's website.
De entiteitsklase kan verschillende soorten eigenschappen bevatten.
Scalaire eigenschap
Scalaire eigenchappan zijn eenvoudig waarden, zoals strings, datums en getallen. Daarin worden de data van de entiteit opgeslagen,
SQL Data Types | .Net | Omschrijving |
bigint | Int54 | Integer data van -2^63 (-9223372036854775808) tot 2^63-1 (9223372036854775807) |
int | Int32 | Integer data van -2^31 (-2.147.483.648) tot 2^31-1 (2.147.483.647) |
smallint | Int16 | Integer data van -2^15 (-32,768) tot 2^15-1 (32.767) |
tinyint | Byte | Integer data van 0 tot 255 |
bit | Boolean | Integer data van 1 of 0 (Boolean bijv. ja/nee) |
decimal | Decimal | Numerieke data types als niet opgegeven dan van -10^38+1 tot 10^38-1 (p) Precision : De maximale totale lengte van decimale digits die opgeslagen kunnen worden. (s) Scale : Het maximale aantal nummers die rechts van de komma opgeslagen kunnen worden. |
numeric | Idem decimal | |
money | Decimal | Valuta data van -2^63 (-9223372036854775808) tot 2^63-1 (9223372036854775807) |
smallmoney | Decimal | Valute data van -2.147.483.648) tot 2^31-1 (2.147.483.647) |
float | Double | Floating precisie nummer data van - 1.79E + 308 tot -2.23E - 308, 0 en 2.23E -308 tot 1.79E + 308 |
real | Single | idem float |
datetime | DateTime | Datum en tijd van 1 januari 1753 tot 31 december 9999 met een precisie van 3.33 milliseconde |
smalldatetime | DateTime | Datum en tijd van 1 januari 1900 tot 6 juni 2079 met een precisie van 1 seconde |
char | Char | Vaste lengte character data met een lengte van 8000 character |
varchar | string | Variabele lengte data met een maximum lengte van 8000 characters |
nchar | string | Vaste lengte unicode data met een lengte van 4000 Characters |
nvarchar | string | Variabele lengte unicode data met een maximum lengte van 4000 Characters |
binary | Byte[] | Vaste lengte binary data met een vaste lengte van 8000 bytes |
varbinary | Byte[] | Variabele lengte binary data met een vaste lengte van 8000 bytes |
timestamp | DateTime | een database-wide unieke nummer dat iedere keer geupdate wordt als de rij gemuteerd wordt |
uniqueidentifier | Guid | een globally unique identifier |
Voor de types Byte, Char en String kan je een maximale lengte opgegeven. Een waarde van -1 betekent de maximum waarde. Alle scalaire types kunnen nullable worden gemaakt, wat betekent dat ze kan geen ingestelde waarde kunnen hebben. In de databank wordt dit weergegeven door een NULL kolom. Scalaire eigenschappen moeten zowel een getter en een setter hebben, maar een setter kan een beperkter bereik hebben dan de getter: internal, protected internal of protected.
Enkele voorbeelden
public int OrderID { get; set; } public int CustomerID { get; set; } public DateTime OrderDate { get; set; } public int CustomerID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; }
Identiteitseigenschap (identity property)
Één of meer van de scalaire eigenschappen van je entiteit moet de primaire sleutel van de onderliggende tabel voorstellen. Die sleutel kan enkelvoudig of samengestelde zijn.
Een primaire-sleutel-eigenschap moet één van de basistypen zijn uit de lijst hierboven. Dus geen arrays en opsommingen, en ook geen complexe eigenschappen of typen gebaseerd op een andere entiteit.
Referentieeigenschap (reference property)
Een verwijzing van een entiteit naar de andere definieert een bidirectionele relatie. Er zijn twee types verwantschapsrelaties:
- veel-op-één (many-to-one): meerdere instanties van een entiteit kunnen aan dezelfde instantie van een ander type (zoals OrderItems die eigendom zijn van Order) gekoppeld worden;
- één-op-één (one-to-one): een instantie van een entiteit wordt gekoppeld aan een andere instantie van een entiteit; deze andere instantie wordt alleen geassocieerd met de eerste (bijvoorbeeld een OrderItem en het Product);
In EFCF worden meerdere instanties, die gekoppeld zijn aan een instantie van een ander type, voorgesteld door collecties. En een associatie wordt vertegenwoordigd door een eigenschap van het type van de andere entiteit.
public class Customer { // one end point of a many to one relationship // a customer has one of many orders public virtual ICollectionOrders { get; set; } }
public class OrderItem { // one endpoint of one to one relationship // one OrderItem belongs to one order public virtual Order Order { get; set; } // one OrderItem has one Product public virtual Product Product { get; set; } }
Door alleen te kijken naar één eindpunt, kunnen we niet direct zeggen wat het type is (één-op-één of veel-op-een), we moeten kijken naar beide eindpunten.
In Entity Framework kan je collecties alleen declareren als ICollection
(of een afgeleide klasse of interface) eigenschappen. In de entiteit, worden de collecties eigenschappen altijd in de constructor geïnitialiseerd.
Complexe eigenschap (complex property)
Dit onderdeel is nog niet klaar.